///////////////////////////////////////////////////////////////////////////////
// File:        ProgressBar.cc
// Author:      671643387@qq.com
// Description:
///////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include "ProgressBar.hpp"

#define X_OFFSET    5
#define BAR_WIDTH   50
///////////////////////////////////////////////////////////////////////////////
ProgressBar::ProgressBar(void)
    : step_(0)
    , bc1_('[')
    , bc2_(']')
    , fc_('#')
{
    Reset();
}

ProgressBar::~ProgressBar(void)
{
    Console::SetDefaultColors();
    printf("\n");
}

///////////////////////////////////////////////////////////////////////////////
void ProgressBar::Step(int step /* = 1 */)
{
    if (step_ >= BAR_WIDTH)
        return;

    // draw foreground
    for (int x = 0; x < step; ++x)
    {
        Console::SetCursorPos(cx_, cy_);
        printf("%c", fc_);
        ++cx_;
    }

    step_ += step;

    // draw text
    Console::SetCursorPos(BAR_WIDTH + X_OFFSET * 2, cy_);
    printf("%*d%%", 3, step_ * 2);
}

void ProgressBar::Reset(void)
{
    step_ = 0;

    Console::GetCursorPos(cx_, cy_);
    cx_ = 0;
    cx_ += X_OFFSET;

    // draw background
    Console::SetCursorPos(cx_ - 1, cy_);
    printf("%c", bc1_);
    Console::SetCursorPos(cx_ + BAR_WIDTH, cy_);
    printf("%c", bc2_);
    Console::SetCursorPos(cx_, cy_);
    for (int x = 0; x < BAR_WIDTH; ++x)
        printf(" ");

    // draw text
    Console::SetCursorPos(BAR_WIDTH + X_OFFSET * 2, cy_);
    printf("%*d%%", 3, step_ * 2);
}